const { body, param, validationResult } = require('express-validator');

// 处理验证错误
const handleValidationErrors = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({
      message: '输入验证失败',
      errors: errors.array()
    });
  }
  next();
};

// 用户注册验证
const validateRegister = [
  body('username')
    .isLength({ min: 3, max: 20 })
    .withMessage('用户名长度必须在3-20个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  body('email')
    .isEmail()
    .withMessage('请输入有效的邮箱地址'),
  body('password')
    .isLength({ min: 6, max: 20 })
    .withMessage('密码长度必须在6-20个字符之间')
    .matches(/^(?=.*[a-zA-Z])(?=.*\d)/)
    .withMessage('密码必须包含字母和数字'),
  handleValidationErrors
];

// 用户登录验证
const validateLogin = [
  body('username')
    .notEmpty()
    .withMessage('用户名不能为空'),
  body('password')
    .notEmpty()
    .withMessage('密码不能为空'),
  handleValidationErrors
];

// 角色卡验证
const validateCharacter = [
  body('name')
    .isLength({ min: 1, max: 100 })
    .withMessage('角色名长度必须在1-100个字符之间'),
  body('stats')
    .isObject()
    .withMessage('属性必须是对象格式'),
  body('skills')
    .isObject()
    .withMessage('技能必须是对象格式'),
  body('inventory')
    .isArray()
    .withMessage('背包必须是数组格式'),
  handleValidationErrors
];

// 模组验证
const validateModule = [
  body('name')
    .isLength({ min: 1, max: 200 })
    .withMessage('模组名称长度必须在1-200个字符之间'),
  body('description')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('描述长度不能超过1000个字符'),
  body('data')
    .isObject()
    .withMessage('模组数据必须是对象格式'),
  handleValidationErrors
];

// 房间验证
const validateRoom = [
  body('name')
    .isLength({ min: 1, max: 200 })
    .withMessage('房间名称长度必须在1-200个字符之间'),
  body('description')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('描述长度不能超过1000个字符'),
  body('moduleId')
    .isInt({ min: 1 })
    .withMessage('模组ID必须是正整数'),
  handleValidationErrors
];

// 骰子指令验证
const validateDiceCommand = [
  body('command')
    .isLength({ min: 1, max: 100 })
    .withMessage('骰子指令长度必须在1-100个字符之间')
    .matches(/^[.r]\s*\d+d\d+(\+\d+)?$/)
    .withMessage('骰子指令格式不正确'),
  handleValidationErrors
];

// 参数验证
const validateId = [
  param('id')
    .isInt({ min: 1 })
    .withMessage('ID必须是正整数'),
  handleValidationErrors
];

module.exports = {
  handleValidationErrors,
  validateRegister,
  validateLogin,
  validateCharacter,
  validateModule,
  validateRoom,
  validateDiceCommand,
  validateId
};
